﻿// Decompiled with JetBrains decompiler
// Type: Microsoft.InfoCards.RpcCryptoRequest
// Assembly: infocard, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// MVID: 8E14765A-6610-409A-BA36-099A0642905D
// Assembly location: E:\git\ALLIDA\windll\infocard.exe

using Microsoft.InfoCards.Diagnostics;
using System;
using System.ComponentModel;
using System.IO;

namespace Microsoft.InfoCards
{
  internal abstract class RpcCryptoRequest
  {
    private RpcCryptoContext m_context;

    protected RpcCryptoRequest(RpcCryptoContext context)
    {
      this.m_context = context;
    }

    public abstract string Name { get; }

    public void Process()
    {
      MemoryStream memoryStream = new MemoryStream();
      this.MarshalOutArgs((Stream) memoryStream);
      byte[] buffer1 = memoryStream.GetBuffer();
      byte[] buffer2;
      try
      {
        buffer2 = NativeMcppMethods.RpcCryptoDispatchRequest(this.m_context.InterfaceHandle, this.m_context.ContextKey, this.Name, buffer1, 0, Convert.ToInt32(memoryStream.Length));
      }
      catch (Win32Exception ex)
      {
        if (ex.NativeErrorCode == -2146434962)
          throw InfoCardTrace.ThrowHelperError((Exception) new UserCancelledException((string) null, (Exception) ex));
        throw InfoCardTrace.ThrowHelperError((Exception) new CommunicationException((string) null, (Exception) ex));
      }
      this.MarshalReturnArgs((Stream) new MemoryStream(buffer2));
    }

    protected abstract void MarshalOutArgs(Stream stream);

    protected abstract void MarshalReturnArgs(Stream stream);
  }
}
